package com.smartleanx.module.hrm.service.employee;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
import javax.validation.*;

import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smartleanx.framework.customfield.core.service.bo.CustomFieldDataRespBO;
import com.smartleanx.framework.tenant.core.aop.TenantIgnore;
import com.smartleanx.module.bpm.api.v2.dto.BpmProcessTemplatesDTO;
import com.smartleanx.module.bpm.api.v2.dto.StartProcessInstanceDTO;
import com.smartleanx.module.hrm.controller.admin.employee.login.EmployeeLoginInfoSaveReqVO;
import com.smartleanx.module.hrm.controller.admin.employee.login.EmployeeLoginInfoRespVO;
import com.smartleanx.module.hrm.controller.admin.employee.regularizerecord.EmployeeRegularizeRecordRespVO;
import com.smartleanx.module.hrm.controller.admin.employee.regularizerecord.EmployeeRegularizeRecordSaveReqVO;
import com.smartleanx.module.hrm.controller.admin.employee.vo.EmployeeLeaveReqVO;
import com.smartleanx.module.hrm.controller.admin.employee.vo.*;
import com.smartleanx.module.hrm.dal.dataobject.employee.EmployeeDO;
import com.smartleanx.framework.common.pojo.PageResult;
import com.smartleanx.module.hrm.dal.dataobject.esign.EsignOrgMember;
import com.smartleanx.module.hrm.dal.dataobject.esign.EsignOrgSeal;
import com.smartleanx.module.hrm.service.employee.bo.EmployeeFileRespBo;
import com.smartleanx.module.hrm.util.esign.constant.MemberRole;
import com.smartleanx.module.infra.api.file.dto.FileRefRespDTO;
import com.smartleanx.module.hrm.service.employee.bo.EmployeeQueryRespBo;
import com.smartleanx.module.system.api.customfield.dto.CustomFieldRespDTO;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

/**
 * 员工 Service 接口
 *
 * @author tengcj
 */
public interface EmployeeService {


    /**
     * 员工下拉
     */
    List<JSONObject> selectEmployeeBySelect(String employeeName);
    /**
     * 创建员工
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createEmployee(@Valid List<EmployeeFieldSaveReqVo> createReqVO);

    /**
     * 创建临时账号
     *
     * @param reqVo
     */
    void createEmployeeOnTrial(EmployeeOnTrialReqVo reqVo);

    /**
     * 更新员工
     *
     * @param saveReqVO 更新信息
     */
    void updateEmployee(@Valid EmployeeSaveReqVO saveReqVO);

    /**
     * 删除员工
     *
     * @param id 编号
     */
    void deleteEmployee(Long id);

    /**
     * 获得员工
     *
     * @param id 编号
     * @return 员工
     */
    EmployeeDO getEmployeeById(Long id);

    /**
     * 获得员工信息
     *
     * @param id    员工id
     * @param label
     * @return
     * @throws IllegalAccessException
     */
    List<List<CustomFieldDataRespBO>> getEmployeeField(Long id, Integer label, Integer labelGroups) throws IllegalAccessException;

    /**
     * 获得登录用户的员工信息
     *
     * @param userId 用户编号
     * @return 员工
     */
    EmployeeDO getEmployeeByUserId(Long userId);

    /**
     * 获得员工列表
     *
     * @param ids 编号集合
     * @return 员工列表
     */
    List<EmployeeDO> getEmployeeList(Collection<Long> ids);

    /**
     * 获得员工列表
     *
     * @param ids 编号集合
     * @return 员工列表
     */
    List<EmployeeDO> getEmployeeListDesc(Collection<Long> ids);

    /**
     * 获得全部员工
     *
     * @return 员工列表
     */
    List<EmployeeDO> getAllEmployee();

    /**
     * 获得员工列表
     *
     * @param deptIdList 部门id列表
     * @param state      员工状态
     * @return 员工列表
     */
    List<EmployeeDO> getEmployeeListByDeptId(Collection<Long> deptIdList, Integer state);

    /**
     * 获得员工分页
     *
     * @param pageReqVO 分页查询
     * @return 员工分页
     */
    PageResult<EmployeePageRespVO> getEmployeePage(EmployeePageReqVO pageReqVO);

    /**
     * 根据岗位id获得员工列表
     *
     * @param postId
     * @return
     */
    List<EmployeeDO> getEmployeeListByPostId(Long postId);

    /**
     * 根据职级id获取员工列表
     *
     * @param postLevelId 职级id
     * @return
     */
    List<EmployeeDO> getEmployeeListByPostLevelId(Long postLevelId);

    /**
     * 获取员工列表导出列表
     *
     * @param pageReqVO
     * @return
     */
    List<EmployeeExportVo> getExportEmployeeExcel(EmployeePageReqVO pageReqVO);

    /**
     * 试用期转正
     *
     * @param regularizeReqVO
     */
    void regularize(EmployeeRegularizeRecordSaveReqVO regularizeReqVO);

    /**
     * 员工提交转正申请
     *
     * @param regularizeReqVO
     */
    void employeeRegularize(EmployeeRegularizeRecordSaveReqVO regularizeReqVO);

    void employeeRegularizeNew(StartProcessInstanceDTO param);

    /**
     * 员工端提交转正申请前校验是否已转正
     *
     * @return
     */
    EmployeeBasicInfoRespVo validateRegularize();

    BpmProcessTemplatesDTO validateRegularizeNew(String type,Integer tgType);

    /**
     * 调动
     *
     * @param changePostReqVO
     */
    void changePost(EmployeeChangePostSaveReqVO changePostReqVO);

    /**
     * 员工端提交调动申请前校验是否已有待审批的记录
     *
     * @return
     */
    EmployeeBasicInfoRespVo validateChangePost();

    BpmProcessTemplatesDTO validateChangePostNew(String type,Integer tgType);

    /**
     * 获取员工调动记录信息
     *
     * @param id
     * @return
     */
    EmployeeChangePostRespVO getEmployeeChangePost(Long id);

    /**
     * 员工端操作调动
     *
     * @param changePostReqVO
     */
    void employeeChangePost(EmployeeChangePostSaveReqVO changePostReqVO);

    void employeeChangePostNew(StartProcessInstanceDTO param);

    /**
     * 离职
     *
     * @param leaveReqVO
     */
    void leave(EmployeeLeaveReqVO leaveReqVO);

    /**
     * 用户提交离职记录
     *
     * @param leaveReqVO
     */
    void employeeLeave(EmployeeLeaveReqVO leaveReqVO);

    void employeeLeaveNew(StartProcessInstanceDTO param);

    /**
     * 员工提交离职申请前校验员工状态
     *
     * @return
     */
    EmployeeBasicInfoRespVo validateLeave();

    BpmProcessTemplatesDTO validateLeaveNew(String type,Integer tgType);

    // /**
    //  * 取消离职
    //  *
    //  * @param cancelLeaveReqVO
    //  */
    // void cancelLeave(EmployeeCancelLeaveReqVO cancelLeaveReqVO);

    /**
     * 获取员工操作日志
     *
     * @param logReqVO
     * @return
     */
    PageResult<EmployeeLogRespVO> getEmployeeActionLog(EmployeeLogReqVO logReqVO);

    // /**
    //  * 更新离职信息
    //  *
    //  * @param leaveReqVO
    //  */
    // void updateLeaveInfo(EmployeeLeaveReqVO leaveReqVO);

    /**
     * 获取员工各个状态数量
     *
     * @return
     */
    List<EmployeeStatusCountRespVO> countStatusNum(EmployeePageReqVO pageReqVO);

    /**
     * 上传文件
     *
     * @param addFileReqVO
     * @return
     */
    void addFile(EmployeeAddFileReqVO addFileReqVO);

    /**
     * 获取员工文件列表
     *
     * @param addFileReqVO
     * @return
     */
    List<FileRefRespDTO> getFileListByFileType(EmployeeAddFileReqVO addFileReqVO);

    /**
     * 获取员工基础信息
     *
     * @param ids 用户id
     * @return
     */
    List<EmployeeQueryRespBo> getEmployeeQueryRespBo(Collection<Long> ids);

    /**
     * 更新员工状态
     *
     * @param updateStatusReqVO
     */
    void updateEmployeeStatus(EmployeeUpdateStatusReqVO updateStatusReqVO);

    /**
     * 回显转正申请信息
     *
     * @param id
     * @return
     */
    EmployeeRegularizeRecordRespVO getEmployeeRegularize(Long id);

    /**
     * 根据员工id获取员工基本信息
     *
     * @param id
     * @return
     */
    EmployeeBasicInfoRespVo getEmployeeInfo(Long id);

    /**
     * 批量获取用户基本信息
     *
     * @param ids
     * @return
     */
    List<EmployeeBasicInfoRespVo> getEmployeeInfoByIds(Collection<Long> ids);

    /**
     * 批量获取用户基础信息
     *
     * @param ids
     * @return
     */
    List<EmployeeBasicInfoRespVo> getEmployeeInfoList(Collection<Long> ids);

    /**
     * 根据员工编号，批量获取员工
     *
     * @param employeeNos
     * @return
     */
    List<EmployeeDO> selectListByEmployeeNoS(Collection<String> employeeNos);

    /**
     * 根据员工编号，获取员工
     *
     * @param employeeNo
     * @return
     */
    EmployeeDO selectByEmployeeNo(String employeeNo);

    /**
     * 获取员工离职申请信息
     *
     * @param id
     * @return
     */
    EmployeeLeaveRespVO getEmployeeLeave(Long id);


    /**
     * 获取资料附件
     *
     * @param id      员工id
     * @param isAdmin 是否是管理端查看（true 是 false 否）
     * @return
     */
    List<EmployeeFileRespBo> employeeFiles(Long id, Boolean isAdmin);

    /**
     * 创建员工附件关联关系
     *
     * @param vo
     * @return
     */
    boolean createEmployeeFileRef(EmployeeFileReqVo vo);

    /**
     * 首页仪表盘人事概况
     *
     * @return
     */
    List<EmployeeOverviewRespVo> getEmployeeOverview();

    /**
     * 首页仪表盘待办提醒
     *
     * @return
     */
    EmployeeToDoReminderRespVo getEmployeeToDoReminder();

    /**
     * 获取首页在职
     *
     * @return
     */
    EmployeeOnTheJobRespVo getOnTheJob();

    /**
     * 首页仪表盘生日弹窗分页
     *
     * @param pageReqVO
     * @return
     */
    PageResult<EmployeePageRespVO> getBirthdayPage(EmployeeDashboardPageReqVO pageReqVO);

    /**
     * 获取入职周年员工分页
     *
     * @param pageReqVO
     * @return
     */
    PageResult<EmployeePageRespVO> getAnniversaryEmployeePage(EmployeeDashboardPageReqVO pageReqVO);

    /**
     * 待转正员工提醒（提前7天/15天） 弹窗
     *
     * @param pageReqVO
     * @return
     */
    PageResult<EmployeePageRespVO> getNotifyRegularizeEmployeePage(EmployeeDashboardPageReqVO pageReqVO);

    /**
     * 首页仪表盘合同到期弹窗分页
     *
     * @param pageReqVO
     * @return
     */
    PageResult<EmployeePageRespVO> getContractExpirationPage(EmployeeDashboardPageReqVO pageReqVO);


    // -----------------审批回调start--------------------

    /**
     * 员工转正申请通过
     *
     * @param id 转正记录id
     */
    void approvedRegularize(Long id, Integer approveResult);

    /**
     * 员工转正申请驳回 / 取消
     *
     * @param id 转正记录id
     */
    void rejectRegularize(Long id, Integer approveResult);

    /**
     * 员工调动申请通过
     *
     * @param id 调动记录id
     */
    void approvedChangePost(Long id, Integer approveResult);

    /**
     * 员工调动申请驳回 / 取消
     *
     * @param id 调动记录id
     */
    void rejectChangePost(Long id, Integer approveResult);

    /**
     * 员工离职审批通过
     *
     * @param id 离职记录id
     */
    void approvedLeave(Long id, Integer approveResult);

    /**
     * 员工离职审批驳回 / 取消
     *
     * @param id 离职记录id
     */
    void rejectLeave(Long id, Integer approveResult);

    /**
     * 获取员工列表
     *
     * @param name 员工姓名，可为空
     * @return
     */
    List<EmployeeLeaderRespVo> getEmployeeList(String name);
    List<EmployeeLeaderRespVo> getEmployeeList();

    // -----------------审批回调end--------------------

    /**
     * 获取自定义字段（用于生成导入模板）
     *
     * @return
     */
    List<CustomFieldRespDTO> downloadExcelFiled();

    EmployeeImportRespVO importExcel(MultipartFile file) throws IOException;

    /**
     * 获取当前用户员工id
     *
     * @return
     */
    Long getEmployeeId();

    /**
     * 获取发薪员工列表
     *
     * @param year  年
     * @param month 发薪月
     * @return
     */
    List<EmployeeDO> getEmployeePayee(Integer year, Integer month);

    /**
     * 获取员工离职信息（员工档案编辑用）
     *
     * @param employeeId
     * @return
     */
    EmployeeSeparationRespVo getEmployeeSeparation(Long employeeId);

    /**
     * 删除员工文件  扫描风险
     * @param ids 文件id
     * @return
     */
    Boolean removeEmployeeFile(Collection<Long> ids);

    /**
     * 创建登录信息
     *
     * @param reqVO
     * @return
     */
    void createLoginInfo(EmployeeLoginInfoSaveReqVO reqVO);

    /**
     * 更新登录信息
     *
     * @param reqVO
     * @return
     */
    void updateLoginInfo(EmployeeLoginInfoSaveReqVO reqVO);

    /**
     * 获取员工信息
     *
     * @param userId
     * @return
     */
    EmployeeLoginInfoRespVO getLoginInfo(Long userId);

    /**
     * 根据条件返回用户id
     *
     * @param queryRepVo
     * @return
     */
    List<Long> getEmployeeIdsByQuery(EmployeeQueryRepVo queryRepVo);

    /**
     * 定时任务扫描员工状态
     */
    void scanEmployeeState();

    /**
     * 站内信
     */
    void notifyMessageSendJob();

    /**
     * 扫描员工合同是否终止
     */
    void updateTerminationStatus();

    /**
     * 模糊查询员工
     *
     * @param queryReqVO
     * @return
     */
    List<EmployeeDO> getEmployeeSimpleList(EmployeeLikeQueryReqVO queryReqVO);

    /**
     * 删除员工登录信息
     *
     * @param id
     */
    void deleteLoginInfo(Long id);

    /**
     * 按照组织结构获取员工分页列表(只查在职)
     *
     * @param reqVo
     * @return
     */
    PageResult<EmployeeDeptPageRespVo> employeeDeptPage(EmployeeDeptPageReqVo reqVo);

    /**
     * 根据用户id获取员工信息
     *
     * @param userIds
     */
    List<EmployeeDO> getEmployeeByUserIds(Set<Long> userIds);

    /**
     * 查询开通登录账号的员工
     *
     * @param queryReqVO
     * @return
     */
    List<EmployeeDO> getLoginEmpList(EmployeeLikeQueryReqVO queryReqVO);



    Integer  sendMessage(String tenantName,String phone,String account);


    Integer retrievePassword(String tenantName,String phone,String account,String messageCode,String password);


    /**
     * 员工是否进行了个人认证并授权
     */
    Integer selectAuthorizedStatus();


    /**
     * 实名认证信息
     */
    JSONObject selectPsnInfo();


    /**
     * 查看创建人
     */
    String getByCreateByName(Integer createById);

}
